package com.imagecollector.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.velocity.shaded.commons.io.FilenameUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author: wrf
 * @Date: 2024/6/26 13:22
 * @Description: 通用工具类
 */
@Component
@Slf4j
public class CommonUtils {

    // 手机号匹配的正则表达式
    private static final String REGEX = "^1[3-9]\\d{9}$";

    // 邮箱匹配的正则表达式
    private static final String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@(.+)$";

    /**
     * 手机号检测正则方法
     */
    public static boolean checkPhoneIsValid(String phone) {
        if (phone == null || phone.length() != 11) {
            return false;
        }
        return phone.matches(REGEX);
    }

    /**
     * 获取Ip地址
     *
     * @param request
     * @return
     */
    public static String getIpAddress(HttpServletRequest request) {
        String Xip = request.getHeader("X-Real-IP");
        String XFor = request.getHeader("X-Forwarded-For");
        if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
            //多次反向代理后会有多个ip值，第一个ip才是真实ip
            int index = XFor.indexOf(",");
            if (index != -1) {
                return XFor.substring(0, index);
            } else {
                return XFor;
            }
        }
        XFor = Xip;
        if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
            return XFor;
        }
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("Proxy-Client-IP");
        }
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("HTTP_CLIENT_IP");
        }
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
            XFor = request.getRemoteAddr();
        }
        return XFor;
    }


    /**
     * 屏蔽手机号中间四位。
     *
     * @param phoneNumber 原始手机号码字符串。
     * @return 返回屏蔽处理后的手机号码字符串。
     */
    public static String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.length() < 8) {
            throw new IllegalArgumentException("手机号码格式不正确或过短");
        }
        // 使用正则表达式替换手机号码中间的四位数字为星号
        return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
    }

    /**
     * 检查给定的电子邮件地址是否符合预定义的正则表达式模式。
     */
    public static Boolean checkEmail(String email) {
        // 使用正则表达式验证电子邮件格式
        if (StringUtils.isBlank(email)) {
            return false;
        }
        return email.matches(EMAIL_REGEX);
    }

    /**
     * 检测上传的文件是否是 xlsx 或 xls 类型
     *
     * @param file 上传的文件
     * @return 如果是 xlsx 或 xls 类型，返回 true；否则返回 false
     */
    public static boolean isExcelFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return false;
        }
        // 获取文件扩展名
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        return "xlsx".equalsIgnoreCase(extension) || "xls".equalsIgnoreCase(extension);
    }

}
